// src/stores/userStore.js
import {defineStore} from 'pinia';
import {ref, watch} from 'vue'; // 引入watch，监听Token变化自动同步存储
import http from "@/request/http.js";
import router from "@/router/index.js";

export const useUserStore = defineStore('user', () => {
    // 1. 响应式状态初始化：优先从sessionStorage读取（与request.js一致），其次从localStorage备份读取
    const token = ref(
        sessionStorage.getItem('Token') || localStorage.getItem('token') || ''
    );
    // 用户信息：从localStorage读取（持久化，避免刷新丢失）
    const userInfo = ref(
        JSON.parse(localStorage.getItem('userInfo')) || null
    );

    // 2. 监听Token变化，自动同步到sessionStorage和localStorage
    watch(
        token,
        (newToken) => {
            if (newToken) {
                // Token存在时：双存储
                sessionStorage.setItem('Token', newToken); // sessionStorage：键=Token（与request.js匹配）
                localStorage.setItem('token', newToken);   // localStorage：键=token（持久化备份）
            } else {
                // Token清空时：双删除
                sessionStorage.removeItem('Token');
                localStorage.removeItem('token');
            }
        },
        {immediate: true} // 初始化时立即执行一次，确保存储与状态同步
    );

    // 3. 监听用户信息变化，自动同步到localStorage（持久化）
    watch(
        userInfo,
        (newUserInfo) => {
            if (newUserInfo) {
                localStorage.setItem('userInfo', JSON.stringify(newUserInfo));
            } else {
                localStorage.removeItem('userInfo');
            }
        },
        {immediate: true, deep: true} // deep=true：监听对象内部属性变化
    );

    // 4. 登录方法：获取Token后更新响应式状态（存储同步由watch自动处理）
    // src/stores/userStore.js
    const login = async (username, password, code) => {
        try {
            // 1. 调用登录接口，获取后端响应
            const res = await http.post('/admin/user/login/username', {username, password, code: code});

            // 2. 先验证后端返回的状态码（code=0 表示登录成功）
            if (res.code !== 0) {
                throw new Error(res.message || '登录失败，后端返回错误');
            }

            // 3. 关键修改：从 res.data 中获取 Token（与后端返回格式完全对齐）
            const newToken = res.data;

            // 4. 验证 Token 有效性（非空 + 是字符串）
            if (!newToken || typeof newToken !== 'string') {
                throw new Error('登录失败，未获取到有效Token');
            }

            // 5. 更新响应式 Token（watch 会自动同步到 sessionStorage 和 localStorage）
            token.value = newToken;
            console.log('登录成功，获取到 Token：', newToken);
            // 刷新当前页面
            window.location.reload();

            // （可选）若后续需要用户信息，可调用 /user/getUserInfo 接口（此时 Token 已存储）
            // 例如：
            // const userRes = await get('/user/getUserInfo');
            // userInfo.value = userRes.data;

            return true;
        } catch (error) {
            console.error('登录失败：', error.message);
            // 登录失败时清空状态，避免残留无效数据
            token.value = '';
            userInfo.value = null;
            return false;
        }
    };

    // 登出方法（添加跳转逻辑）
    const logoutUser = async () => {
        try {
            const currentToken = token.value;
            if (currentToken) {
                // 调用后端登出接口（按后端要求不传请求体）
                await http.post('/admin/user/logoutUser', undefined, {
                    headers: {Authorization: `Bearer ${currentToken}`}
                });
                console.log('后端登出接口调用成功');
            }
        } catch (error) {
            console.error('登出接口调用失败（不影响本地状态清空）：', error.message || error);
        } finally {
            // 1. 清空本地状态
            // 刷新当前页面

            token.value = '';
            userInfo.value = null;
            console.log('登出成功，Token和用户信息已清空');

            // 2. 关键：登出后跳转到 recommend 页面
            if (router.currentRoute.value.path !== '/recommend') {
                await router.push('/recommend'); // 用await确保跳转完成
                console.log('已跳转到推荐页');
            }
            setTimeout(() => window.location.reload(), 500);
        }
    };

    // 6. 判断登录状态：基于Token是否存在
    const isLogin = () => !!token.value;

    return {
        token,       // 响应式Token（双存储同步）
        userInfo,    // 响应式用户信息（localStorage持久化）
        login,       // 登录方法
        logoutUser,      // 登出方法
        isLogin      // 登录状态判断
    };
});